# -*- coding:utf-8 -*-

__author__ = 'zhl'
"""
专题报表-龙虎榜-买卖交易前5名
"""
from EmQuantAPI import *
from datetime import timedelta, datetime
import time as _time
import traceback
import numpy as np
import pandas as pd
from sqlalchemy import create_engine



"""
创建Pandas DataFrame 数据结构
label=list()
dict={0:[],1:[]}
"""



def dict_convert_dataframe_append_toscv(file,dict,label,df):
   
    for k,v in dict.items():
        data = [v]  
        df = df.append(pd.DataFrame(data,index=[k],columns=label))
        df.to_csv(file,mode="a",header=False)
    return df

def dict_convert_dataframe(dict,label,df):
   
    for k,v in dict.items():
        data = [v]  
        df = df.append(pd.DataFrame(data,index=[k],columns=label))
    return df

def mainCallback(quantdata):
    """
    mainCallback 是主回调函数，可捕捉如下错误
    在start函数第三个参数位传入，该函数只有一个为c.EmQuantData类型的参数quantdata
    :param quantdata:c.EmQuantData
    :return:
    """
    print("mainCallback", str(quantdata))
    # 登录掉线或者 登陆数达到上线（即登录被踢下线） 这时所有的服务都会停止
    if str(quantdata.ErrorCode) == "10001011" or str(quantdata.ErrorCode) == "10001009":
        print("Your account is disconnect. You can force login automatically here if you need.")
    # 行情登录验证失败（每次连接行情服务器时需要登录验证）或者行情流量验证失败时，会取消所有订阅，用户需根据具体情况处理
    elif str(quantdata.ErrorCode) == "10001021" or str(quantdata.ErrorCode) == "10001022":
        print("Your all csq subscribe have stopped.")
    # 行情服务器断线自动重连连续6次失败（1分钟左右）不过重连尝试还会继续进行直到成功为止，遇到这种情况需要确认两边的网络状况
    elif str(quantdata.ErrorCode) == "10002009":
        print("Your all csq subscribe have stopped, reconnect 6 times fail.")
        # 行情订阅遇到一些错误(这些错误会导致重连，错误原因通过日志输出，统一转换成EQERR_QUOTE_RECONNECT在这里通知)，正自动重连并重新订阅,可以做个监控
    elif str(quantdata.ErrorCode) == "10002012":
        print("csq subscribe break on some error, reconnect and request automatically.")
        # 资讯服务器断线自动重连连续6次失败（1分钟左右）不过重连尝试还会继续进行直到成功为止，遇到这种情况需要确认两边的网络状况
    elif str(quantdata.ErrorCode) == "10002014":
        print("Your all cnq subscribe have stopped, reconnect 6 times fail.")
    # 资讯订阅遇到一些错误(这些错误会导致重连，错误原因通过日志输出，统一转换成EQERR_INFO_RECONNECT在这里通知)，正自动重连并重新订阅,可以做个监控
    elif str(quantdata.ErrorCode) == "10002013":
        print("cnq subscribe break on some error, reconnect and request automatically.")
    # 资讯登录验证失败（每次连接资讯服务器时需要登录验证）或者资讯流量验证失败时，会取消所有订阅，用户需根据具体情况处理
    elif str(quantdata.ErrorCode) == "10001024" or str(quantdata.ErrorCode) == "10001025":
        print("Your all cnq subscribe have stopped.")
    else:
        pass


def startCallback(message):
    print("[EmQuantAPI Python]", message)
    return 1


def getStockTradingInfo(oldId):
    """
    获取 龙虎榜 买卖交易前5名
    """
    options="OldID="+oldId
    # 2021-03-09 21:48:06
    # 该表主要提供指定日期、指定股票的交易异动龙虎榜(营业部、买卖金额等) 参数: 个股买卖交易排位表依赖字段 字段: 买/卖 会员营业部名称 买入金额 买入金额占比 卖出金额 卖出金额占比 净买入金额 净买入金额占比
    data_res=c.ctr("StockTradingInfo","STR_MAI,SALESNAME,BMONEY,DEC_MAIRUZHANBI,SMONEY,DEC_MAICHUZHANBI,DEC_JINBMONEY,DEC_JINBMONEYZHANBI"
        ,options)
    return data_res


def result_handler(data_res,old_id):
    if(data_res.ErrorCode != 0):
        print("request ctr Error, ", data_res.ErrorMsg)
    else:
        print("ctr龙虎榜-买卖交易前5名输出结果======分割线======")
        # print(data_res.Codes)
        # print()
        # print(data_res.Dates)
        # print()
        # print(data_res.Indicators )
        # print()
        # print(data_res.Data)
        # for key,value in data_res.Data.items():
        #     print()
        #     print(value)
            # for v in value:
                #  print(v, " ", end="")
            # print()
        # 创建 DataFrame 结构数据
        label=data_res.Indicators
        label.insert(0,"OLDID")
        data_res_={}
        for key,value in data_res.Data.items():
            value.insert(0,old_id)
            data_res_[key]=value
            
        
        

        df2=pd.DataFrame()
        pd_data2=dict_convert_dataframe(data_res_, label, df2)
        # # pd_data2.to_csv(file)
        # pd_data2.to_csv(file,mode="a",header=False)

        #将数据写入数据库
        pd.io.sql.to_sql(pd_data2, table_name, con, if_exists="append",index=False)


try:
    # 调用登录函数（激活后使用，不需要用户名密码）
    loginResult = c.start("ForceLogin=1", '', mainCallback)
    if(loginResult.ErrorCode != 0):
        print("login in fail")
        exit()
    print(" 获取专题报表-龙虎榜-买卖交易前5名-2021年3月9日")
  
    startDate="2021-04-02"
    endDate="2021-04-02"
    # oldId="X93597106" # 从龙虎榜-个股交易信息表中获取
    file_prefix="winner_list_bs_top5"
    file=file_prefix+"-"+startDate+"_"+endDate+".csv"
    table_name=file_prefix+"-"+startDate+"_"+endDate

    con=create_engine('mysql+pymysql://root:root@localhost:3306/stack?charset=utf8')
    sql_="SELECT OLDID FROM `winner_list_indivi_info-2021-04-02_2021-04-02`"
    db_oldid_data=pd.read_sql(sql_,con)
    res_data=np.array(db_oldid_data)
    # print(db_oldid_data.head(10))
    # print(db_oldid_data.tail(10))
    data_list=res_data.tolist()
    
    print(len(data_list[0:72])) #下次继续
    for k in data_list[0:72]:
        d=k[0]
        data_res=getStockTradingInfo(d)
        
        result_handler(data_res,d)

    # print(data_list[0:10])
    
    # print(data_list[44:144])
    # data_res=getStockTradingInfo(oldId)
    #执行数据处理函数
    # result_handler(data_res)


except Exception as ee:
    print("error >>>", ee)
    traceback.print_exc()
else:
    print("获取专题报表-龙虎榜-买卖交易前5名表-end")

finally:
    # 退出
    data_shareholder = logoutResult = c.stop()
    con.dispose() #关闭数据库连接
    
